package com.itany.cloud.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.itany.cloud.util.ExceptionUtil;
import com.itany.cloud.util.ResponseResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    // @SentinelResource注解用于配置服务熔断
    // 默认情况下,设置了流控规则之后,出现问题由Sentinel定义的异常解决
    // 通过该注解,可以自定义异常信息
    // 该注解所在的方法必须使用public进行修饰
    // value属性:对哪一个资源进行配置,其值不能有/
        // 如果此处没有指定请求值,其值直接就是空字符串
    // blockHandler属性:使用哪一个方法进行配置,属性值对应的是方法名
    // 如果只有该属性,方法存在以下要求
        // 1.方法必须在当前类中
        // 2.方法的返回值必须与当前方法的返回值一致
        // 3.方法的参数必须是BlockException
        // 4.对应的方法必须使用public进行修饰
    @RequestMapping("/f1")
    @SentinelResource(value = "f1",blockHandler = "handlerException")
    public ResponseResult f1(){
        return ResponseResult.success();
    }

    public ResponseResult handlerException(BlockException e){
        return ResponseResult.fail("Sentinel异常,异常为:"+e);
    }

    // blockHandlerClass属性:指定当前方法所调用的全局异常处理方法所在的类
    // blockHandler属性:此时的方法指定的是对应的全局类中的方法名
    @RequestMapping("/f2")
    @SentinelResource(value = "f2",blockHandlerClass = ExceptionUtil.class,blockHandler = "exceptionHandler")
    public ResponseResult f2(){
        return ResponseResult.success();
    }

}
